package it.uniroma3.dia.cluster;

//import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;

//import winterwell.jtwitter.Twitter;
//import winterwell.jtwitter.Twitter.Status;
import winterwell.jtwitter.Twitter.User;

public class ClusterByCommonFriends implements ClusterSelector {

	private User user;
//metodo che si occupa del calcolo degli amici in comune tra  il root user e un suo amico estratto dalla coda
	public int calcolaAmiciComuni(List<User> amiciPrimoUtente,
			List<User> amiciAmicoPrimoUtente) {
		int amiciComuni = 0;
		for (User user: amiciPrimoUtente){
			for(User amico:amiciAmicoPrimoUtente){
				if(user.getScreenName().equals(amico.getScreenName()))
					amiciComuni++;
			}
		}
		
		return amiciComuni;
	}


//metodo che si occupa di calcolare i cluster nei quali inserire gli amici del root user	
	public HashMap<Integer, LinkedList<User>> clusterizza(HashMap<User, Integer> amico2amiciComuni,
			int numeMedioAmiciInComune) {
		LinkedList<User> cluster1 = new LinkedList<User>(); // 0 amici in comune
		LinkedList<User> cluster2 = new LinkedList<User>(); // 1 1<x<2/3media
		LinkedList<User> cluster3 = new LinkedList<User>(); // 2/3media<x<4/3media
		LinkedList<User> cluster4 = new LinkedList<User>(); // x>4/3media
		
		
		HashMap<Integer, LinkedList<User>> clusterizzazione = new HashMap<Integer, LinkedList<User>>();
		
		for(User u: amico2amiciComuni.keySet()){
			if(amico2amiciComuni.get(u) == 0)
				aggiungiCluster(cluster1, u);
			if(amico2amiciComuni.get(u) > 0 && amico2amiciComuni.get(u) <= (2*numeMedioAmiciInComune)/2)
				aggiungiCluster(cluster2, u);
			if(amico2amiciComuni.get(u) > (2*numeMedioAmiciInComune)/2 && amico2amiciComuni.get(u) <= (4*numeMedioAmiciInComune)/3)
				aggiungiCluster(cluster3, u);
			if(amico2amiciComuni.get(u) > (4*numeMedioAmiciInComune)/3)
				aggiungiCluster(cluster4, u);
			
			
		}
		clusterizzazione.put(1, cluster1);
		clusterizzazione.put(2, cluster2);
		clusterizzazione.put(3, cluster3);
		clusterizzazione.put(4, cluster4);
		
		
		
		return clusterizzazione;
		
	}




	private void aggiungiCluster(LinkedList<User> cluster, User u) {
		cluster.add(u);
		
	}




	@Override
	public int calcolaMediaAmiciInComune(
			HashMap<User, Integer> amico2amiciComuni) {
		int mediaAmiciComuni = 0;
		int parziale = 0;
		int numeroAmiciTotali = amico2amiciComuni.size();
		for(User amico: amico2amiciComuni.keySet()){
			parziale += amico2amiciComuni.get(amico);
			
		}
		mediaAmiciComuni = parziale/numeroAmiciTotali;
		return mediaAmiciComuni;
	}
	

}
